// Daemon.hpp
#pragma once
#include <signal.h>
#include <iostream>
#include <unistd.h>
#include "Log.hpp"
#include <cstring>
#include <cerrno>
#include "Err.hpp"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// setsid
// 1.调用进程不能是组长（父进程）
// 2.守护进程
// a.忽略异常信号 b.0,1,2要做特殊处理 c.进程工作路径可能需要修改
void Daemon()
{
    // 1.忽略信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);
    // 2.新建会话，让自己成为会话的首进程
    //守护进程不能是父进程
    int pid = fork();
    if (pid > 0)
    {
        exit(0);
    }
    int ret = setsid();
    if (ret == -1)
    {
        LogMessage(Fatal, "setsid error:", strerror(errno));
        exit(SETSID_ERR);
    }
    // 3.处理文件描述符
    int fd = open("/dev/null", O_RDWR);
    if (fd < 0)
    {
        LogMessage(Fatal, "open error:", strerror(errno));
        exit(OPEN_ERR);
    }
    dup2(fd, 0);
    dup2(fd, 1);
    dup2(fd, 2);
    close(fd);
}
